import base64
import json

from PySide6.QtWidgets import QWidget, QFileDialog
from Forms.FacePage import Ui_Form
from Utils.AiCloud import FaceTest


class FacePage(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        if parent is not None:
            self.setParent(self)
        # 加载FacePage的ui文件
        self.ui = Ui_Form()
        # 装载ui到本对象
        self.ui.setupUi(self)
        # 添加imageABase64属性用于存储A图片的base64编码
        self.imageABase64 = ''
        # 添加imageBBase64属性用于存储B图片的base64编码
        self.imageBBase64 = ''
        # 初始化所有的信号槽连接
        self.initConnect()

    # 调用此方法将会初始化所有的信号槽的连接
    def initConnect(self):
        # 连接“选择图片按钮”的clicked信号与selectImageA方法的信号槽
        self.ui.selectButtonA.clicked.connect(self.selectImageA)
        # 连接“选择图片按钮”的clicked信号与selectImageB方法的信号槽
        self.ui.selectButtonB.clicked.connect(self.selectImageB)
        # 连接“检测按钮”的clicked信号与checkAB方法的信号槽
        self.ui.checkButton.clicked.connect(self.checkAB)

    # 选择图片方法，此方法用于选择图片A
    def selectImageA(self):
        # 创建一个打开文件对话框
        file = QFileDialog()
        file.exec()
        # 把选择的路径赋值给path变量
        path = file.selectedFiles()[0]
        # 设置图像框A的图片路径
        self.ui.ImageWidgetA.setImagePath(path)
        # 把选择的图片进行base64编码并存储在imageABase64属性中
        with open(path, 'rb') as image:
            self.imageABase64 = base64.b64encode(image.read()).decode('utf-8')

    # 选择图片方法，此方法用于选择图片B
    def selectImageB(self):
        # 创建一个打开文件对话框
        file = QFileDialog()
        file.exec()
        # 把选择的路径赋值给path变量
        path = file.selectedFiles()[0]
        print(path)
        # 设置图像框B的图片路径
        self.ui.ImageWidgetB.setImagePath(path)
        # 把选择的图片进行base64编码并存储在imageBBase64属性中
        with open(path, 'rb') as image:
            self.imageBBase64 = base64.b64encode(image.read()).decode('utf-8')

    # 人脸相似度检测方法
    def checkAB(self):
        # 判断imageABase64和imageBBase64是否为空字符串，如果是则终止检测
        if self.imageABase64 == '' or self.imageBBase64 == '':
            return
        # 将imageABase64和imageBBase64封装到字典中，方便传参
        params = {
            "ImageA": self.imageABase64,
            "ImageB": self.imageBBase64,
            "NeedRotateDetection": 1
        }
        # 调用人脸检测服务并将params传递进去拿到响应结果转换成字典赋值给res
        res = json.loads(FaceTest(params))
        # 更新label控件的显示的文本
        self.ui.label.setText('相似度：{:.2f}%'.format(res['Score']))
